iT邦幫忙

2023 iThome 鐵人賽

DAY 29
0
自我挑戰組

網路爬蟲系列 第 29

【Day29】網路爬蟲-用Beautiful Soup實作案例

  • 分享至 

  • xImage
  •  

實作案例:爬取博客來圖書資訊

Python程式的基底URL

URL = "http://search.books.com.tw/search/query/key/{0}/cat/all"

上述URL變數是用來在generate_search_url()函數產生網址後,呼叫web_scraping_bot()函數來爬取查詢結果的圖書資訊。
Python函數:generate_search_url()函數
在generate_search_url()函數的參數是基底 URL 和關鍵字,我們是呼叫format()函數建立搜尋圖書關鍵字的網址。

def generate_search_url (url,keyword):
    url = url. format (keyword)

    return url

Python函數:web_scraping_bot()函數
在web_scraping_bot()函數的參數中,只有1個目標網址,因為這次的爬蟲程式需要從多頁網頁取得資料,所以判斷 HTTP請求是否成功移至 parse_html()函數

def web_scraping_bot(url):
    booklist = [["書名","ISBN","網址","書價"]]
    print("抓取網路資料中...")
    soup = parse_html (get_resource (url))
    if soup != None:
        #print (soup)
        tag_item = soup. find_all (class_="item")
        for item in tag_item:
            book = []
            book. append (item.find ("img") ["alt"])
            book. append (get_ISBN (item. find ("a") ["href"]))
            book. append ("http:" + item. find ("a") ["href"])
            price = item. find (class="price").find all ("b")

上述程式碼呼叫 parse_html() 函數成功剖析網頁後,呼叫find_all()函數取出所有圖書清單的HTML標籤,然後使用for/in迴圈一一爬取每一本圖書資料,依序是書名、ISBN、網址,ISBN是再呼叫get_ISBN()函數來取得,參數是圖書頁面的URL。接著,在下方取得圖書價格。

            if len (price)== 1:
                book. append (price [0]. string)
            else:
                book. append (price [1] .string)
            booklist. append (book)
            print("等待2秒鐘...")
            time, sleep (2)
            
return booklist

上述if/else條件判斷定價是否存在(因為可能有定價或優惠價),在取得圖書資訊 book 清單後,呼叫append()函數新增至bookist巢狀清單。
Python函數:parse_html()函數
在parse_html()函數的參數是Requests物件,if/else條件判斷是否請求成功,成功就傳回 Beautiful Soup 剖析的 HTML網頁

def parse_html (r) :
    if r. status_code == requests.codes.ok:
        r.encoding = "utf8"
        soup = BeautifulSoup (r. text, "lxml")
    else:
        print ("HTTP請求錯誤..." + url)
        soup = None

    return soup          

Python函數:get_ISBN()函數
在get_ISBN()函數首先呼叫 parse_html()函數,取得圖書資料網址的Beautiful Soup 物件,即可尋找ISBN的標籤。

def get_ISBN (url) :
    soup = parse_html (get_resource ("http:" + url))
    if soup != None:
        try:
           isbn = soup. find (itemprop="productID") ["content"] [5:]
        except:
           isbn = "0000"
        else:
           isbn = "1111"
        return isbn

上述try/except是取得圖書的ISBN,如果找到的話就傳回ISBN碼;沒有找到的話就傳回0000;剖析失敗會傳回1111。


上一篇
【Day28】網路爬蟲-輸出Scrapy爬取的資料
下一篇
【Day30】網路爬蟲-用Selenium實作案例
系列文
網路爬蟲30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言